package eu.catengine.graphic;

import eu.catengine.common.iface.IDisposable;
import eu.catengine.primitive.Size;

/**
 * Klasa przechowująca dane dotyczące animacji.
 * 
 * @author mbienkowski
 */
public class TextureAnimation implements IDisposable
{
    private String mName;
    private int mDuration;
    private int mFrames;
    private int mFrameDuration;
    
    private Texture mTexture;
    private TextureRegion[] mRegions;

    /**
     * Konstuktor domyślny. <br>
     * Obiekty tej klasy tworzone są automatycznie przez AnimationManager. <br>
     * Nie należy tworzyć pojedynczych obiektów klasy bez udziału managera.
     */
    public TextureAnimation(String animationName, Texture texture, TextureRegion[] regions, int duration, int frames)
    {
	this.mName = animationName;
	this.mTexture = texture;
	this.mRegions = regions;
	this.mDuration = duration;
	this.mFrames = frames;
	this.mFrameDuration = duration / frames;
    }

    /**
     * Zwraca region odpowiedzialny za klatkę animacji.
     */
    public TextureRegion getRegion(long frameIndex)
    {
	return mRegions[(int) frameIndex];
    }

    /**
     * Zwraca rozmiar klatki.
     */
    public Size getSize()
    {
	return mRegions[0].getSize();
    }
    
    /**
     * Zwraca szerokość klatki.
     */
    public float getWidth()
    {
	return mRegions[0].getSize().width;
    }
    
    /**
     * Zwraca wysokość klatki.
     */
    public float getHeight()
    {
	return mRegions[0].getSize().height;
    }

    /**
     * Zwraca teksturę wykorzystywaną przez animację.
     */
    public Texture getTexture()
    {
	return mTexture;
    }

    /**
     * Zwraca nazwę animacji.
     */
    public String getName()
    {
	return mName;
    }

    /**
     * Zwraca czas trwania animacji w ms.
     */
    public int getDuration()
    {
	return mDuration;
    }

    /**
     * Zwraca ilość klatek animacji.
     */
    public int getFrames()
    {
	return mFrames;
    }

    /**
     * Zwraca czas trwania poszczególnej klatki animacji.
     */
    public int getFrameDuration()
    {
	return mFrameDuration;
    }

    @Override
    public void dispose()
    {
	mTexture.dispose();
	
	mName = null;
	mTexture = null;
	mRegions = null;
    }
}
